package com.hup.minicontroller.common.framework;

import android.app.Application;
import android.util.Log;

import androidx.annotation.NonNull;

import java.lang.Thread.UncaughtExceptionHandler;

/**
 * 线程异常处理类
 * 本类的使用:
 * .目的是:为了避免开发时[app重启造成丢失日志],只在开发时使用
 * .在 {@link Application#onCreate()}时,调用 {@link #registerHandler()},就可以替换默认的处理器,实现打印异常并不让app强退
 * .但由于ui线程的异常是不可逆的,所以异常后app会卡死,显示程序无响应
 * .关于 {@link UncaughtExceptionHandler},本项目不深究;可以实现异常后导出日志到本地或服务器的功能
 * 说明:
 * .安卓机制:main/UI线程出现异常后,app就强退了,极度不科学!但也阻止不了
 * .关键的坑是:如果app有启动安卓服务,则app异常强退后,会被系统重新启动(不启动Activity,只会启动服务),导致AS界面错误日志丢失
 * .错误日志找回方法:日志界面选择NoFilter, 然后在过滤文本框输入包名
 */
public class NotCrashExceptionHandler implements UncaughtExceptionHandler {
    private static final String TAG = NotCrashExceptionHandler.class.getSimpleName();

    public static void registerHandler() {
        Log.i(TAG, "registerHandler: DefaultUncaughtExceptionHandler=" + Thread.getDefaultUncaughtExceptionHandler());
        Thread.setDefaultUncaughtExceptionHandler(new NotCrashExceptionHandler());
    }

    @Override
    public void uncaughtException(@NonNull Thread t, @NonNull Throwable e) {
        Log.e(TAG, "uncaughtException: thread=" + t, e);
//        System.exit(1);//不能exit,否则系统会重启安卓服务,导致日志丢失!!
    }

}
